home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / samba / patches / samba-1.022 / samba-1
Text File  |  1995-11-04  |  36KB  |  1,211 lines

  1. diff -u -r --new-file last-version/docs/smbstatus.1 samba-1.9.14p2/docs/smbstatus.1
  2. --- last-version/docs/smbstatus.1    Mon Mar 20 22:44:50 1995
  3. +++ samba-1.9.14p2/docs/smbstatus.1    Sat Nov  4 23:20:23 1995
  4. @@ -21,6 +21,9 @@
  5.  .I -d
  6.  gives verbose output.
  7.  
  8. +.I -p
  9. +print a list of smbd processes and exit. Useful for scripting.
  10. +
  11.  .SH ENVIRONMENT VARIABLES
  12.  Not applicable.
  13.  
  14. diff -u -r --new-file last-version/source/change-log samba-1.9.14p2/source/change-log
  15. --- last-version/source/change-log    Mon Oct 30 17:28:11 1995
  16. +++ samba-1.9.14p2/source/change-log    Sat Nov  4 23:21:02 1995
  17. @@ -1605,10 +1605,21 @@
  18.      - fix client bug for long dirs in NT1 mode. 
  19.      Thanks to Erwin Authried (erwin@ws1.atv.tuwien.ac.at)
  20.      - switched to a safer (but probably slower) readbraw implementation
  21. +    - released p1
  22. +    - readbraw fix from Stefaan.Eeckels@eunet.lu
  23. +    - fixed groups bug when user is in 1 group
  24. +    - fixed NT1 dir bug
  25. +    - changed default protocol in client to NT1
  26. +    - changed trans2 to not return both names in long listing if long
  27. +    name is 8.3
  28. +    - made stat of "" return RONLY if not writeable drive
  29. +    - wrapped strcpy() to stop nulls propogating (hack)
  30. +    - made rename and unlink look at share locks on file
  31. +    - clitar memory leak fix from jjm@jjm.com
  32. +    - added -p option to smbstatus to list smbd processes
  33. +    - released p2
  34.  
  35.  
  36. -
  37. -
  38.  ==========
  39.  todo:
  40.  
  41. @@ -1640,6 +1651,8 @@
  42.  write-only shares
  43.  
  44.  document cnvchar stuff
  45. +
  46. +allow smbd to serve user and group lists to win95
  47.  
  48.  UNRESOLVED PROBLEMS
  49.  ===================
  50. diff -u -r --new-file last-version/source/client.c samba-1.9.14p2/source/client.c
  51. --- last-version/source/client.c    Mon Oct 30 17:13:49 1995
  52. +++ samba-1.9.14p2/source/client.c    Sat Nov  4 21:31:10 1995
  53. @@ -46,7 +46,7 @@
  54.  #define SHORT_TIMEOUT (5*1000)
  55.  
  56.  int name_type = ' ';
  57. -int max_protocol = PROTOCOL_LANMAN2;
  58. +int max_protocol = PROTOCOL_NT1;
  59.  
  60.  
  61.  time_t newer_than = 0;
  62. @@ -484,7 +484,118 @@
  63.    return(True);
  64.  }
  65.  
  66. +/****************************************************************************
  67. +interpret a short filename structure
  68. +The length of the structure is returned
  69. +****************************************************************************/
  70. +static int interpret_short_filename(char *p,file_info *finfo)
  71. +{
  72. +  finfo->mode = CVAL(p,21);
  73. +
  74. +  finfo->ctime = make_unix_date(p+22,True);
  75. +  finfo->mtime = finfo->atime = finfo->ctime;
  76. +  finfo->size = IVAL(p,26);
  77. +  strcpy(finfo->name,p+30);
  78. +  
  79. +  return(DIR_STRUCT_SIZE);
  80. +}
  81. +
  82. +/****************************************************************************
  83. +interpret a long filename structure - this is mostly guesses at the moment
  84. +The length of the structure is returned
  85. +The structure of a long filename depends on the info level. 260 is used
  86. +by NT and 2 is used by OS/2
  87. +****************************************************************************/
  88. +static int interpret_long_filename(int level,char *p,file_info *finfo)
  89. +{
  90. +  if (finfo)
  91. +    memcpy(finfo,&def_finfo,sizeof(*finfo));
  92. +
  93. +  switch (level)
  94. +    {
  95. +    case 1: /* OS/2 understands this */
  96. +      if (finfo)
  97. +    {
  98. +      finfo->ctime = make_unix_date2(p+4,True);
  99. +      finfo->atime = make_unix_date2(p+8,True);
  100. +      finfo->mtime = make_unix_date2(p+12,True);
  101. +      finfo->size = IVAL(p,16);
  102. +      finfo->mode = CVAL(p,24);
  103. +      strcpy(finfo->name,p+27);
  104. +    }
  105. +      return(28 + CVAL(p,26));
  106. +
  107. +    case 2: /* this is what OS/2 uses mostly */
  108. +      if (finfo)
  109. +    {
  110. +      finfo->ctime = make_unix_date2(p+4,True);
  111. +      finfo->atime = make_unix_date2(p+8,True);
  112. +      finfo->mtime = make_unix_date2(p+12,True);
  113. +      finfo->size = IVAL(p,16);
  114. +      finfo->mode = CVAL(p,24);
  115. +      strcpy(finfo->name,p+31);
  116. +    }
  117. +      return(32 + CVAL(p,30));
  118.  
  119. +      /* levels 3 and 4 are untested */
  120. +    case 3:
  121. +      if (finfo)
  122. +    {
  123. +      finfo->ctime = make_unix_date2(p+8,True);
  124. +      finfo->atime = make_unix_date2(p+12,True);
  125. +      finfo->mtime = make_unix_date2(p+16,True);
  126. +      finfo->size = IVAL(p,20);
  127. +      finfo->mode = CVAL(p,28);
  128. +      strcpy(finfo->name,p+33);
  129. +    }
  130. +      return(SVAL(p,4)+4);
  131. +
  132. +    case 4:
  133. +      if (finfo)
  134. +    {
  135. +      finfo->ctime = make_unix_date2(p+8,True);
  136. +      finfo->atime = make_unix_date2(p+12,True);
  137. +      finfo->mtime = make_unix_date2(p+16,True);
  138. +      finfo->size = IVAL(p,20);
  139. +      finfo->mode = CVAL(p,28);
  140. +      strcpy(finfo->name,p+37);
  141. +    }
  142. +      return(SVAL(p,4)+4);
  143. +
  144. +    case 260: /* NT uses this, but also accepts 2 */
  145. +      if (finfo)
  146. +    {
  147. +      extern int serverzone;
  148. +      int ret = SVAL(p,0);
  149. +      int namelen;
  150. +      p += 4; /* next entry offset */
  151. +      p += 4; /* fileindex */
  152. +      finfo->ctime = interpret_long_date(p); p += 8;
  153. +      finfo->atime = interpret_long_date(p); p += 8;
  154. +      finfo->mtime = interpret_long_date(p); p += 8; p += 8;
  155. +      finfo->mtime += DSTDiff(finfo->mtime) - serverzone;
  156. +      finfo->ctime += DSTDiff(finfo->ctime) - serverzone;
  157. +      finfo->atime += DSTDiff(finfo->atime) - serverzone;
  158. +      finfo->size = IVAL(p,0); p += 8;
  159. +      p += 8; /* alloc size */
  160. +      finfo->mode = CVAL(p,0); p += 4;
  161. +      namelen = IVAL(p,0); p += 4;
  162. +      p += 4; /* EA size */
  163. +      p += 2; /* short name len? */
  164. +      p += 24; /* short name? */      
  165. +      StrnCpy(finfo->name,p,namelen);
  166. +      return(ret);
  167. +    }
  168. +      return(SVAL(p,0));
  169. +    }
  170. +
  171. +  DEBUG(1,("Unknown long filename format %d\n",level));
  172. +  return(SVAL(p,0));
  173. +}
  174. +
  175. +
  176. +
  177. +
  178.  /****************************************************************************
  179.    act on the files in a dir listing
  180.    ****************************************************************************/
  181. @@ -937,7 +1048,6 @@
  182.        strcat(mask,"*");
  183.    }
  184.  
  185. -  expand_mask(mask,True);
  186.    do_dir(inbuf,outbuf,mask,attribute,NULL,recurse);
  187.  
  188.    do_dskattr();
  189. @@ -1732,8 +1842,9 @@
  190.  
  191.    if (finfo->mtime == 0 || finfo->mtime == -1)
  192.      {
  193. +      time_t t = time(NULL);
  194.        finfo->mtime = finfo->atime = finfo->ctime = 
  195. -    time(NULL) + GMT_TO_LOCAL*TimeDiff(0);
  196. +    t + GMT_TO_LOCAL*TimeDiff(t);
  197.      }
  198.    
  199.    CVAL(outbuf,smb_com) = SMBcreate;
  200. @@ -2405,6 +2516,53 @@
  201.  }
  202.  
  203.  /****************************************************************************
  204. +rename some files
  205. +****************************************************************************/
  206. +static void cmd_rename(char *inbuf,char *outbuf )
  207. +{
  208. +  pstring src,dest;
  209. +  fstring buf,buf2;
  210. +  char *p;
  211. +  
  212. +  strcpy(src,cur_dir);
  213. +  strcpy(dest,cur_dir);
  214. +  
  215. +  if (!next_token(NULL,buf,NULL) || !next_token(NULL,buf2,NULL))
  216. +    {
  217. +      DEBUG(0,("rename <src> <dest>\n"));
  218. +      return;
  219. +    }
  220. +  strcat(src,buf);
  221. +  strcat(dest,buf2);
  222. +
  223. +  bzero(outbuf,smb_size);
  224. +  set_message(outbuf,1,4 + strlen(src) + strlen(dest),True);
  225. +  
  226. +  CVAL(outbuf,smb_com) = SMBmv;
  227. +  SSVAL(outbuf,smb_tid,cnum);
  228. +  SSVAL(outbuf,smb_vwv0,aHIDDEN | aDIR | aSYSTEM);
  229. +  setup_pkt(outbuf);
  230. +  
  231. +  p = smb_buf(outbuf);
  232. +  *p++ = 4;      
  233. +  strcpy(p,src);
  234. +  p = skip_string(p,1);
  235. +  *p++ = 4;      
  236. +  strcpy(p,dest);
  237. +  
  238. +  send_smb(outbuf);
  239. +  receive_smb(inbuf,CLIENT_TIMEOUT);
  240. +  
  241. +  if (CVAL(inbuf,smb_rcls) != 0)
  242. +    {
  243. +      DEBUG(0,("%s renaming files\n",smb_errstr(inbuf)));
  244. +      return;
  245. +    }
  246. +  
  247. +}
  248. +
  249. +
  250. +/****************************************************************************
  251.  toggle the prompt flag
  252.  ****************************************************************************/
  253.  static void cmd_prompt(void)
  254. @@ -2737,13 +2895,12 @@
  255.      sec_mode = SVAL(inbuf,smb_vwv1);
  256.      max_xmit = SVAL(inbuf,smb_vwv2);
  257.      sesskey = IVAL(inbuf,smb_vwv6);
  258. -    servertime = make_unix_date(inbuf+smb_vwv8);
  259. +    servertime = make_unix_date(inbuf+smb_vwv8,False);
  260.      serverzone = SVALS(inbuf,smb_vwv10)*60;
  261. -    servertime -= DSTDiff(servertime);
  262. -      if (Protocol >= PROTOCOL_COREPLUS) {
  263. -    readbraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x1) != 0);
  264. -    writebraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x2) != 0);
  265. -      }
  266. +    if (Protocol >= PROTOCOL_COREPLUS) {
  267. +      readbraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x1) != 0);
  268. +      writebraw_supported = ((SVAL(inbuf,smb_vwv5) & 0x2) != 0);
  269. +    }
  270.      crypt_len = smb_buflen(inbuf);
  271.      memcpy(cryptkey,smb_buf(inbuf),8);
  272.      DEBUG(3,("max mux %d\n",SVAL(inbuf,smb_vwv3)));
  273. @@ -3299,6 +3456,7 @@
  274.    {"mget",cmd_mget,"<mask> get all the matching files"},
  275.    {"put",cmd_put,"<local name> [remote name] put a file"},
  276.    {"mput",cmd_mput,"<mask> put all matching files"},
  277. +  {"rename",cmd_rename,"<src> <dest> rename some files"},
  278.    {"more",cmd_more,"<remote name> view a remote file with your pager"},  
  279.    {"mask",cmd_select,"<mask> mask all filenames against this"},
  280.    {"del",cmd_del,"<mask> delete all matching files"},
  281. diff -u -r --new-file last-version/source/clitar.c samba-1.9.14p2/source/clitar.c
  282. --- last-version/source/clitar.c    Wed Sep 20 00:30:15 1995
  283. +++ samba-1.9.14p2/source/clitar.c    Sat Nov  4 23:05:01 1995
  284. @@ -427,6 +427,7 @@
  285.        reopen_connection(inbuf,outbuf))
  286.      {
  287.        do_atar(rname,lname,finfo1);
  288. +      free(inbuf);free(outbuf);
  289.        return;
  290.      }
  291.  
  292. @@ -854,7 +855,8 @@
  293.     * from the mod. time, and the access time to current time
  294.     */
  295.    finfo->mtime = finfo->ctime = strtol(hb->dbuf.mtime, NULL, 8);
  296. -  finfo->atime = time(NULL) + GMT_TO_LOCAL*TimeDiff(0);
  297. +  finfo->atime = time(NULL);
  298. +  finfo->atime += GMT_TO_LOCAL*TimeDiff(finfo->atime);
  299.    finfo->size = unoct(hb->dbuf.size, sizeof(hb->dbuf.size));
  300.  
  301.    return True;
  302. @@ -994,7 +996,7 @@
  303.    setup_pkt(outbuf);
  304.    
  305.    SSVAL(outbuf,smb_vwv0,fnum);
  306. -  SIVAL(outbuf,smb_vwv1,finfo.mtime-TimeDiff(0));
  307. +  SIVAL(outbuf,smb_vwv1,finfo.mtime-TimeDiff(finfo.mtime));
  308.    
  309.    DEBUG(3,("Setting date to %s (0x%X)",
  310.         asctime(LocalTime(&finfo.mtime,LOCAL_TO_GMT)),
  311. diff -u -r --new-file last-version/source/includes.h samba-1.9.14p2/source/includes.h
  312. --- last-version/source/includes.h    Sun Oct 22 13:39:14 1995
  313. +++ samba-1.9.14p2/source/includes.h    Sat Nov  4 21:51:34 1995
  314. @@ -959,6 +959,9 @@
  315.  #define F_UNLCK 0
  316.  #endif /* HAVE_FCNTL_LOCK == 0 */
  317.  
  318. +#ifndef strcpy
  319. +#define strcpy(dest,src) StrCpy(dest,src)
  320. +#endif
  321.  
  322.  
  323.  /* possibly wrap the malloc calls */
  324. diff -u -r --new-file last-version/source/ipc.c samba-1.9.14p2/source/ipc.c
  325. --- last-version/source/ipc.c    Thu Sep 21 20:49:48 1995
  326. +++ samba-1.9.14p2/source/ipc.c    Sat Nov  4 18:58:24 1995
  327. @@ -943,7 +943,8 @@
  328.  
  329.    {
  330.      struct tm *t;
  331. -    time_t unixdate = time(NULL) + GMT_TO_LOCAL*TimeDiff(0);
  332. +    time_t unixdate = time(NULL);
  333. +    unixdate += GMT_TO_LOCAL*TimeDiff(unixdate);
  334.  
  335.      t = LocalTime(&unixdate,0);
  336.  
  337. @@ -953,7 +954,7 @@
  338.      CVAL(p,9) = t->tm_min;
  339.      CVAL(p,10) = t->tm_sec;
  340.      CVAL(p,11) = 0;        /* hundredths of seconds */
  341. -    SSVALS(p,12,TimeDiff(0)/60); /* timezone in minutes from GMT */
  342. +    SSVALS(p,12,TimeDiff(unixdate)/60); /* timezone in minutes from GMT */
  343.      SSVAL(p,14,10000);        /* timer interval in 0.0001 of sec */
  344.      CVAL(p,16) = t->tm_mday;
  345.      CVAL(p,17) = t->tm_mon + 1;
  346. diff -u -r --new-file last-version/source/locking.c samba-1.9.14p2/source/locking.c
  347. --- last-version/source/locking.c    Fri Sep 15 20:48:58 1995
  348. +++ samba-1.9.14p2/source/locking.c    Sat Nov  4 22:03:18 1995
  349. @@ -164,6 +164,68 @@
  350.  }
  351.  
  352.  /*******************************************************************
  353. +get the share mode of a file using the files name
  354. +********************************************************************/
  355. +int get_share_mode_byname(int cnum,char *fname,int *pid)
  356. +{
  357. +  struct stat st;
  358. +  pstring lname;
  359. +  char *name;
  360. +  int fd2;
  361. +  char buf[16];
  362. +  int ret;
  363. +  time_t t;
  364. +
  365. +  *pid = 0;
  366. +
  367. +  name = lname;
  368. +
  369. +  strcpy(name,lp_lockdir());
  370. +  standard_sub(cnum,name);
  371. +  trim_string(name,"","/");
  372. +  if (!*name) return(0);
  373. +  name += strlen(name);
  374. +  
  375. +  if (stat(fname,&st) == -1)
  376. +    return(0);
  377. +
  378. +  sprintf(name,"/share.%d.%d",(int)st.st_dev,(int)st.st_ino);
  379. +
  380. +  fd2 = open(lname,O_RDONLY,0);
  381. +  if (fd2 < 0) return(0);
  382. +
  383. +  if (read(fd2,buf,16) != 16) {
  384. +    close(fd2);
  385. +    unlink(lname);
  386. +    return(0);
  387. +  }
  388. +  close(fd2);
  389. +
  390. +  t = IVAL(buf,0);
  391. +  ret = IVAL(buf,4);
  392. +  *pid = IVAL(buf,8);
  393. +  
  394. +  if (IVAL(buf,12) != LOCKING_VERSION) {    
  395. +    if (!unlink(lname)) DEBUG(2,("Deleted old locking file %s",lname));
  396. +    *pid = 0;
  397. +    return(0);
  398. +  }
  399. +
  400. +  if (*pid && !process_exists(*pid)) {
  401. +    ret=0;
  402. +    *pid = 0;
  403. +  }
  404. +
  405. +  if (! *pid) unlink(lname); /* XXXXX race, race */
  406. +
  407. +  if (*pid)
  408. +    DEBUG(5,("Read share file %s mode 0x%X pid=%d\n",lname,ret,*pid));
  409. +
  410. +  return(ret);
  411. +}
  412. +
  413. +
  414. +/*******************************************************************
  415.  del the share mode of a file, if we set it last
  416.  ********************************************************************/
  417.  void del_share_mode(int fnum)
  418. diff -u -r --new-file last-version/source/printing.c samba-1.9.14p2/source/printing.c
  419. --- last-version/source/printing.c    Thu Sep 21 20:27:02 1995
  420. +++ samba-1.9.14p2/source/printing.c    Thu Nov  2 09:59:36 1995
  421. @@ -62,13 +62,13 @@
  422.    
  423.    /* get the print command for the service. */
  424.    tstr = command;
  425. -  if (tstr == NULL) {
  426. +  if (!syscmd || !tstr) {
  427.      DEBUG(0,("No print command for service `%s'\n", SERVICE(snum)));
  428.      return (NULL);
  429.    }
  430.  
  431.    /* copy the command into the buffer for extensive meddling. */
  432. -  strcpy(syscmd, tstr);
  433. +  StrnCpy(syscmd, tstr, sizeof(pstring) - 1);
  434.    
  435.    /* look for "%s" in the string. If there is no %s, we cannot print. */   
  436.    if (!strstr(syscmd, "%s") && !strstr(syscmd, "%f")) {
  437. @@ -83,7 +83,7 @@
  438.         the subshell causes a "cd" to be executed.
  439.         Only use the full path if there isn't a / preceding the %s */
  440.      if (iOffset==0 || syscmd[iOffset-1] != '/') {
  441. -      strcpy(filename,Connections[cnum].connectpath);
  442. +      StrnCpy(filename,Connections[cnum].connectpath,sizeof(filename));
  443.        trim_string(filename,"","/");
  444.        strcat(filename,"/");
  445.        strcat(filename,filename1);
  446. diff -u -r --new-file last-version/source/reply.c samba-1.9.14p2/source/reply.c
  447. --- last-version/source/reply.c    Mon Oct 30 17:31:07 1995
  448. +++ samba-1.9.14p2/source/reply.c    Sat Nov  4 22:32:47 1995
  449. @@ -492,7 +492,8 @@
  450.       under WfWg - weird! */
  451.    if (! (*fname))
  452.      {
  453. -      mode = 0x12;
  454. +      mode = aHIDDEN | aDIR;
  455. +      if (!CAN_WRITE(cnum)) mode |= aRONLY;
  456.        size = 0;
  457.        mtime = 0;
  458.        ok = True;
  459. @@ -1165,6 +1166,7 @@
  460.    if (fmode & aRONLY) return(False);
  461.    if ((fmode & ~dirtype) & (aHIDDEN | aSYSTEM))
  462.      return(False);
  463. +  if (!check_file_sharing(cnum,fname)) return(False);
  464.    return(True);
  465.  }
  466.  
  467. @@ -1183,6 +1185,7 @@
  468.    int count=0;
  469.    int error = ERRnoaccess;
  470.    BOOL has_wild;
  471. +  BOOL exists=False;
  472.  
  473.    *directory = *mask = 0;
  474.  
  475. @@ -1214,6 +1217,7 @@
  476.      strcat(directory,"/");
  477.      strcat(directory,mask);
  478.      if (can_delete(directory,cnum,dirtype) && !sys_unlink(directory)) count++;
  479. +    if (!count) exists = file_exist(directory,NULL);    
  480.    } else {
  481.      void *dirptr = NULL;
  482.      char *dname;
  483. @@ -1245,8 +1249,12 @@
  484.        }
  485.    }
  486.    
  487. -  if (count == 0)
  488. -    return(UNIXERROR(ERRDOS,error));
  489. +  if (count == 0) {
  490. +    if (exists)
  491. +      return(ERROR(ERRDOS,error));
  492. +    else
  493. +      return(UNIXERROR(ERRDOS,error));
  494. +  }
  495.    
  496.    outsize = set_message(outbuf,0,0,True);
  497.    
  498. @@ -1330,6 +1338,11 @@
  499.      ret = transfer_file(fd,Client,nread-predict,header,4+predict,
  500.              startpos+predict);
  501.    }
  502. +
  503. +  if (ret != nread+4)
  504. +    DEBUG(0,("ERROR: file read failure on %s at %d for %d bytes (%d)\n",
  505. +         fname,startpos,nread,ret));
  506. +
  507.  #else
  508.    ret = read_file(fnum,header+4,startpos,nread,nread,-1,False);
  509.    if (ret < mincount) ret = 0;
  510. @@ -1338,11 +1351,6 @@
  511.    transfer_file(0,Client,0,header,4+ret,0);
  512.  #endif
  513.  
  514. -
  515. -  if (ret != nread+4)
  516. -    DEBUG(0,("ERROR: file read failure on %s at %d for %d bytes (%d)\n",
  517. -         fname,startpos,nread,ret));
  518. -
  519.    DEBUG(5,("readbraw finished\n"));
  520.    return -1;
  521.  }
  522. @@ -2451,13 +2459,12 @@
  523.  static BOOL can_rename(char *fname,int cnum)
  524.  {
  525.    struct stat sbuf;
  526. -  int fmode;
  527.  
  528.    if (!CAN_WRITE(cnum)) return(False);
  529.  
  530.    if (sys_lstat(fname,&sbuf) != 0) return(False);
  531. -  fmode = dos_mode(cnum,fname,&sbuf);
  532. -  if (fmode & aRONLY) return(False);
  533. +  if (!check_file_sharing(cnum,fname)) return(False);
  534. +
  535.    return(True);
  536.  }
  537.  
  538. @@ -2475,6 +2482,7 @@
  539.    int count=0;
  540.    int error = ERRnoaccess;
  541.    BOOL has_wild;
  542. +  BOOL exists=False;
  543.  
  544.    *directory = *mask = 0;
  545.  
  546. @@ -2509,6 +2517,7 @@
  547.      if (resolve_wildcards(directory,newname) && 
  548.      can_rename(directory,cnum) && 
  549.      !sys_rename(directory,newname)) count++;
  550. +    if (!count) exists = file_exist(directory,NULL);
  551.    } else {
  552.      void *dirptr = NULL;
  553.      char *dname;
  554. @@ -2543,8 +2552,12 @@
  555.        }
  556.    }
  557.    
  558. -  if (count == 0)
  559. -    return(UNIXERROR(ERRDOS,error));
  560. +  if (count == 0) {
  561. +    if (exists)
  562. +      return(ERROR(ERRDOS,error));
  563. +    else
  564. +      return(UNIXERROR(ERRDOS,error));
  565. +  }
  566.    
  567.    outsize = set_message(outbuf,0,0,True);
  568.    
  569. @@ -2927,12 +2940,13 @@
  570.    CHECK_FNUM(fnum,cnum);
  571.    CHECK_ERROR(fnum);
  572.  
  573. -  /* Convert the DOS times into dos times. Ignore create
  574. +  /* Convert the DOS times into unix times. Ignore create
  575.       time as UNIX can't set this.
  576.       */
  577.    
  578. -  unix_times.actime = make_unix_date2(inbuf+smb_vwv3);
  579. -  unix_times.modtime = make_unix_date2(inbuf+smb_vwv5);
  580. +  /* XXXX - should this include the DST offset? */
  581. +  unix_times.actime = make_unix_date2(inbuf+smb_vwv3,False);
  582. +  unix_times.modtime = make_unix_date2(inbuf+smb_vwv5,False);
  583.    unix_times.actime += LOCAL_TO_GMT*TimeDiff(unix_times.actime);
  584.    unix_times.modtime += LOCAL_TO_GMT*TimeDiff(unix_times.modtime);
  585.    
  586. diff -u -r --new-file last-version/source/server.c samba-1.9.14p2/source/server.c
  587. --- last-version/source/server.c    Mon Oct 30 17:08:57 1995
  588. +++ samba-1.9.14p2/source/server.c    Sat Nov  4 22:11:05 1995
  589. @@ -47,9 +47,6 @@
  590.  /* the last message the was processed */
  591.  int last_message = -1;
  592.  
  593. -/* does getgroups return ints or gid_t ?? */
  594. -BOOL groups_use_ints = True;
  595. -
  596.  /* a useful macro to debug the last message processed */
  597.  #define LAST_MESSAGE() smb_fn_name(last_message)
  598.  
  599. @@ -1168,6 +1165,26 @@
  600.    return(AFAIL);      
  601.  }
  602.  
  603. +/*******************************************************************
  604. +check if the share mode on a file allows it to be deleted or unlinked
  605. +return True if sharing doesn't prevent the operation
  606. +********************************************************************/
  607. +BOOL check_file_sharing(int cnum,char *fname)
  608. +{
  609. +  int pid=0;
  610. +  int share_mode = get_share_mode_byname(cnum,fname,&pid);
  611. +
  612. +  if (!pid || !share_mode) return(True);
  613. +  if (share_mode == DENY_DOS)
  614. +    return(pid == getpid());
  615. +
  616. +  /* XXXX exactly what share mode combinations should be allowed for
  617. +     deleting/renaming? */
  618. +  return(False);
  619. +}
  620. +
  621. +
  622.  /****************************************************************************
  623.  open a file with a share mode
  624.  ****************************************************************************/
  625. @@ -2287,7 +2304,15 @@
  626.           dynamically using some very ugly code */
  627.        if (ngroups > 0)
  628.          {
  629. -          for (i=0;i<ngroups;i++)
  630. +      /* does getgroups return ints or gid_t ?? */
  631. +      static BOOL groups_use_ints = True;
  632. +
  633. +      if (groups_use_ints && 
  634. +          ngroups == 1 && 
  635. +          SVAL(igroups,2) == 0x4242)
  636. +        groups_use_ints = False;
  637. +      
  638. +          for (i=0;groups_use_ints && i<ngroups;i++)
  639.              if (igroups[i] == 0x42424242)
  640.                groups_use_ints = False;
  641.            
  642. @@ -2705,6 +2730,7 @@
  643.    int outsize;
  644.    int secword=0;
  645.    BOOL doencrypt = SMBENCRYPT();
  646. +  time_t t = time(NULL);
  647.  
  648.    if (lp_security()>=SEC_USER) secword |= 1;
  649.    if (doencrypt) secword |= 2;
  650. @@ -2723,9 +2749,9 @@
  651.    SSVAL(outbuf,smb_vwv5,raw); /* tell redirector we support
  652.                   readbraw writebraw (possibly) */
  653.    SIVAL(outbuf,smb_vwv6,getpid());
  654. -  SSVAL(outbuf,smb_vwv10, TimeDiff(0) / 60);
  655. +  SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
  656.  
  657. -  put_dos_date(outbuf,smb_vwv8,time(NULL));
  658. +  put_dos_date(outbuf,smb_vwv8,t);
  659.  
  660.    Protocol = PROTOCOL_LANMAN1;
  661.  
  662. @@ -2742,6 +2768,7 @@
  663.    int outsize;
  664.    int secword=0;
  665.    BOOL doencrypt = SMBENCRYPT();
  666. +  time_t t = time(NULL);
  667.  
  668.    if (lp_security()>=SEC_USER) secword |= 1;
  669.    if (doencrypt) secword |= 2;
  670. @@ -2767,8 +2794,8 @@
  671.    SSVAL(outbuf,smb_vwv3,lp_maxmux()); 
  672.    SSVAL(outbuf,smb_vwv4,1);
  673.    SSVAL(outbuf,smb_vwv5,raw); /* readbraw and/or writebraw */
  674. -  SSVAL(outbuf,smb_vwv10, TimeDiff(0)/60);
  675. -  put_dos_date(outbuf,smb_vwv8,time(NULL));
  676. +  SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
  677. +  put_dos_date(outbuf,smb_vwv8,t);
  678.  
  679.    return (outsize);
  680.  }
  681. @@ -2813,7 +2840,7 @@
  682.    SIVAL(outbuf,smb_vwv5+1,0xFFFF); /* raw size */
  683.    SIVAL(outbuf,smb_vwv9+1,capabilities); /* capabilities */
  684.    put_long_date(outbuf+smb_vwv11+1,time(NULL));
  685. -  SSVALS(outbuf,smb_vwv15+1,TimeDiff(0)/60);
  686. +  SSVALS(outbuf,smb_vwv15+1,TimeDiff(time(NULL))/60);
  687.  
  688.    return (smb_len(outbuf)+4);
  689.  }
  690. @@ -3181,7 +3208,10 @@
  691.    crec.uid = Connections[cnum].uid;
  692.    crec.gid = Connections[cnum].gid;
  693.    StrnCpy(crec.name,lp_servicename(snum),sizeof(crec.name)-1);
  694. -  crec.start = time(NULL) + GMT_TO_LOCAL*TimeDiff(0);
  695. +  {
  696. +    time_t t = time(NULL);
  697. +    crec.start = t + GMT_TO_LOCAL*TimeDiff(t);
  698. +  }
  699.    {
  700.      extern struct from_host Client_info;
  701.      StrnCpy(crec.machine,Client_info.name,sizeof(crec.machine)-1);
  702. diff -u -r --new-file last-version/source/smb.h samba-1.9.14p2/source/smb.h
  703. --- last-version/source/smb.h    Sun Oct 22 13:49:05 1995
  704. +++ samba-1.9.14p2/source/smb.h    Sat Nov  4 22:13:27 1995
  705. @@ -703,8 +703,11 @@
  706.  int disk_free(char *path,int *bsize,int *dfree,int *dsize);
  707.  char *uidtoname(int uid);
  708.  char *gidtoname(int gid);
  709. +int get_share_mode_byname(int cnum,char *fname,int *pid);
  710. +BOOL check_file_sharing(int cnum,char *fname);
  711. +char *StrCpy(char *dest,char *src);
  712.  int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line);
  713. -time_t make_unix_date2(void *date_ptr);
  714. +time_t make_unix_date2(void *date_ptr,BOOL add_dst);
  715.  int cached_error_packet(char *inbuf,char *outbuf,int fnum,int line);
  716.  mode_t unix_mode(int cnum,int dosmode);
  717.  BOOL check_name(char *name,int cnum);
  718. @@ -773,7 +776,7 @@
  719.  int name_len(char *s);
  720.  void dos_clean_name(char *s);
  721.  void unix_clean_name(char *s);
  722. -time_t make_unix_date(void *date_ptr);
  723. +time_t make_unix_date(void *date_ptr,BOOL add_dst);
  724.  BOOL lanman2_match( char *str, char *regexp, int case_sig, BOOL autoext);
  725.  BOOL trim_string(char *s,char *front,char *back);
  726.  int byte_checksum(char *buf,int len);
  727. @@ -817,8 +820,6 @@
  728.  int interpret_security(char *str,int def);
  729.  int ChDir(char *path);
  730.  int smb_buflen(char *buf);
  731. -int interpret_short_filename(char *p,file_info *finfo);
  732. -int interpret_long_filename(int level,char *p,file_info *finfo);
  733.  unsigned long interpret_addr(char *str);
  734.  void mangle_name_83(char *s);
  735.  BOOL lp_casesignames(void);
  736. diff -u -r --new-file last-version/source/status.c samba-1.9.14p2/source/status.c
  737. --- last-version/source/status.c    Wed Jul  5 01:30:06 1995
  738. +++ samba-1.9.14p2/source/status.c    Sat Nov  4 23:19:07 1995
  739. @@ -41,6 +41,7 @@
  740.    void *dir;
  741.    char *s;
  742.    BOOL firstopen=True;
  743. +  BOOL processes_only=False;
  744.  
  745.    charset_initialise();
  746.  
  747. @@ -52,16 +53,19 @@
  748.      return(1);
  749.    }
  750.  
  751. -  while ((c = getopt(argc, argv, "ds:")) != EOF) {
  752. +  while ((c = getopt(argc, argv, "pds:")) != EOF) {
  753.      switch (c) {
  754.      case 'd':
  755.        verbose = 1;
  756.        break;
  757. +    case 'p':
  758. +      processes_only = 1;
  759. +      break;
  760.      case 's':
  761.        strcpy(servicesf, optarg);
  762.        break;
  763.      default:
  764. -      fprintf(stderr, "Usage: %s [-d] [-s configfile]\n", *argv);
  765. +      fprintf(stderr, "Usage: %s [-p] [-d] [-s configfile]\n", *argv);
  766.        return (-1);
  767.      }
  768.    }
  769. @@ -91,21 +95,34 @@
  770.  
  771.    uid = getuid();
  772.  
  773. -  printf("\nSamba version %s\n",VERSION);
  774. -
  775. -  printf("Service      uid      gid      pid     machine\n");
  776. -  printf("----------------------------------------------\n");
  777. +  if (!processes_only) {
  778. +    printf("\nSamba version %s\n",VERSION);
  779. +    
  780. +    printf("Service      uid      gid      pid     machine\n");
  781. +    printf("----------------------------------------------\n");
  782. +  }
  783.  
  784.    while (!feof(f))
  785.      {
  786. +      static int last_pid = 0;
  787.        if (fread(&crec,sizeof(crec),1,f) != 1)
  788.      break;
  789. -      if (crec.magic == 0x280267 && process_exists(crec.pid))
  790. -    printf("%-10.10s   %-8s %-8s %5d   %-8s (%s) %s",
  791. -           crec.name,uidtoname(crec.uid),gidtoname(crec.gid),crec.pid,
  792. -           crec.machine,crec.addr,asctime(LocalTime(&crec.start,0)));
  793. +      if (crec.magic == 0x280267 && process_exists(crec.pid)) {
  794. +    if (processes_only) {
  795. +      if (last_pid != crec.pid)
  796. +        printf("%d\n",crec.pid);
  797. +      last_pid = crec.pid; /* XXXX we can still get repeats, have to
  798. +                  add a sort at some time */
  799. +    }
  800. +    else
  801. +      printf("%-10.10s   %-8s %-8s %5d   %-8s (%s) %s",
  802. +         crec.name,uidtoname(crec.uid),gidtoname(crec.gid),crec.pid,
  803. +         crec.machine,crec.addr,asctime(LocalTime(&crec.start,0)));
  804. +      }
  805.      }
  806.    fclose(f);
  807. +
  808. +  if (processes_only) exit(0);
  809.  
  810.    printf("\n");
  811.  
  812. diff -u -r --new-file last-version/source/testparm.c samba-1.9.14p2/source/testparm.c
  813. --- last-version/source/testparm.c    Wed Jul  5 14:20:21 1995
  814. +++ samba-1.9.14p2/source/testparm.c    Sat Nov  4 22:45:32 1995
  815. @@ -78,6 +78,7 @@
  816.    if (argc < 4)
  817.      {
  818.        printf("Press enter to see a dump of your service definitions\n");
  819. +      fflush(stdout);
  820.        getc(stdin);
  821.        lp_dump();      
  822.      }
  823. diff -u -r --new-file last-version/source/trans2.c samba-1.9.14p2/source/trans2.c
  824. --- last-version/source/trans2.c    Thu Sep 21 20:49:49 1995
  825. +++ samba-1.9.14p2/source/trans2.c    Sat Nov  4 20:29:20 1995
  826. @@ -445,7 +445,10 @@
  827.        SIVAL(p,0,mode); p += 4;
  828.        SIVAL(p,0,strlen(fname)); p += 4;
  829.        SIVAL(p,0,0); p += 4;
  830. -      name_convert(p+2,fname,True,SNUM(cnum));
  831. +      if (!is_8_3(fname))
  832. +    name_convert(p+2,fname,True,SNUM(cnum));
  833. +      else
  834. +    *(p+2) = 0;
  835.        strupper(p+2);
  836.        SSVAL(p,0,strlen(p+2));
  837.        p += 2 + 24;
  838. @@ -1200,11 +1203,13 @@
  839.    tvs.actime = st.st_atime;
  840.    mode = dos_mode(cnum,fname,&st);
  841.  
  842. +
  843. +  /* XXXX should these include the DST offsets? */
  844.    switch (info_level)
  845.      {
  846.      case 1:
  847. -      tvs.actime = make_unix_date2(pdata+l1_fdateLastAccess);
  848. -      tvs.modtime = make_unix_date2(pdata+l1_fdateLastWrite);
  849. +      tvs.actime = make_unix_date2(pdata+l1_fdateLastAccess,False);
  850. +      tvs.modtime = make_unix_date2(pdata+l1_fdateLastWrite,False);
  851.        mode = SVAL(pdata,l1_attrFile);
  852.        size = IVAL(pdata,l1_cbFile);
  853.        break;
  854. @@ -1212,15 +1217,15 @@
  855.      case 2:
  856.        if(IVAL(pdata,l2_cbList) || total_data>32)
  857.      return(ERROR(ERRDOS,ERROR_EAS_NOT_SUPPORTED));
  858. -      tvs.actime = make_unix_date2(pdata+l1_fdateLastAccess);
  859. -      tvs.modtime = make_unix_date2(pdata+l1_fdateLastWrite);
  860. +      tvs.actime = make_unix_date2(pdata+l1_fdateLastAccess,False);
  861. +      tvs.modtime = make_unix_date2(pdata+l1_fdateLastWrite,False);
  862.        mode = SVAL(pdata,l1_attrFile);
  863.        size = IVAL(pdata,l1_cbFile);
  864.        break;
  865.  
  866.      case 3:
  867. -      tvs.actime = make_unix_date2(pdata+8);
  868. -      tvs.modtime = make_unix_date2(pdata+12);
  869. +      tvs.actime = make_unix_date2(pdata+8,False);
  870. +      tvs.modtime = make_unix_date2(pdata+12,False);
  871.        size = IVAL(pdata,16);
  872.        mode = IVAL(pdata,24);
  873.        break;
  874. @@ -1228,8 +1233,8 @@
  875.      case 4:
  876.        if (IVAL(pdata,28) != 0 || total_data>36)
  877.      return(ERROR(ERRDOS,ERROR_EAS_NOT_SUPPORTED));    
  878. -      tvs.actime = make_unix_date2(pdata+8);
  879. -      tvs.modtime = make_unix_date2(pdata+12);
  880. +      tvs.actime = make_unix_date2(pdata+8,False);
  881. +      tvs.modtime = make_unix_date2(pdata+12,False);
  882.        size = IVAL(pdata,16);
  883.        mode = IVAL(pdata,24);
  884.        break;
  885. diff -u -r --new-file last-version/source/util.c samba-1.9.14p2/source/util.c
  886. --- last-version/source/util.c    Mon Oct 23 20:19:33 1995
  887. +++ samba-1.9.14p2/source/util.c    Sat Nov  4 22:14:20 1995
  888. @@ -273,9 +273,7 @@
  889.  int extra_time_offset = 0;
  890.  
  891.  static int timediff = 0;
  892. -static int dst_off = 0;
  893.  
  894. -
  895.  /*******************************************************************
  896.  init the time differences
  897.  ********************************************************************/
  898. @@ -290,35 +288,75 @@
  899.    tm_local = *(localtime(&t));
  900.  
  901.    timediff = mktime(&tm_utc) - mktime(&tm_local);
  902. -
  903. -#ifndef NO_ISDST
  904. -  dst_off = tm_local.tm_isdst? (60*60) : 0;
  905. -#endif
  906.  }
  907.  
  908.  
  909.  /*******************************************************************
  910. -return the current DST offset
  911. +return the DST offset for a particular time
  912. +We keep a table of DST offsets to prevent calling localtime() on each 
  913. +call of this function. This saves a LOT of time on many unixes.
  914.  ********************************************************************/
  915.  int DSTDiff(time_t t)
  916.  {
  917. -  static BOOL initialised = False;
  918. -  int ret=0;
  919. -  if (!initialised) {TimeInit(); initialised=True;}
  920. +  static struct dst_table {time_t start,end; BOOL is_dst;} *dst_table = NULL;
  921. +  static int table_size = 0;
  922. +  int i;
  923. +  BOOL is_dst = False;
  924.  
  925. -  ret = dst_off;
  926. +  if (t == 0) t = time(NULL);
  927.  
  928. -#ifdef STRICT_TIMEZONES
  929.  #ifndef NO_ISDST
  930. -  {
  931. -    struct tm tm_local;
  932. -    tm_local = *(localtime(&t));
  933. -    ret = (tm_local.tm_isdst ? 60*60 : 0);
  934. -  }      
  935. -#endif
  936. +  for (i=0;i<table_size;i++)
  937. +    if (t >= dst_table[i].start && t <= dst_table[i].end) break;
  938. +
  939. +  if (i<table_size) {
  940. +    is_dst = dst_table[i].is_dst;
  941. +  } else {
  942. +    time_t low,high;
  943. +
  944. +    dst_table = (struct dst_table *)Realloc(dst_table,
  945. +                          sizeof(dst_table[0])*(i+1));
  946. +    if (!dst_table) {
  947. +      table_size = 0;
  948. +      return(0);
  949. +    }
  950. +
  951. +    table_size++;
  952. +
  953. +    dst_table[i].is_dst = is_dst = (localtime(&t)->tm_isdst?True:False);;
  954. +    dst_table[i].start = dst_table[i].end = t;
  955. +    
  956. +    /* no entry will cover more than 6 months */
  957. +    low = t - 3*30*24*60*60;
  958. +    high = t + 3*30*24*60*60;
  959. +
  960. +    /* widen the new entry using two bisection searches */
  961. +    while (low+60*60 < dst_table[i].start) {
  962. +      t = ((low + dst_table[i].start)/2);
  963. +      if ((localtime(&t)->tm_isdst?True:False) == is_dst)
  964. +    dst_table[i].start = t;
  965. +      else
  966. +    low = t;
  967. +    }
  968. +
  969. +    while (high-60*60 > dst_table[i].end) {
  970. +      t = ((high + dst_table[i].end)/2);
  971. +      if ((localtime(&t)->tm_isdst?True:False) == is_dst)
  972. +    dst_table[i].end = t;
  973. +      else
  974. +    high = t;
  975. +    }    
  976. +
  977. +/*
  978. +    DEBUG(1,("Added DST entry from %s ",
  979. +         asctime(localtime(&dst_table[i].start))));
  980. +    DEBUG(1,("to %s (%d)\n",asctime(localtime(&dst_table[i].end)),
  981. +         dst_table[i].is_dst));
  982. +*/
  983. +  }
  984.  #endif
  985.  
  986. -  return(ret - (extra_time_offset*60));
  987. +  return((is_dst?60*60:0) - (extra_time_offset*60));
  988.  }
  989.  
  990.  /****************************************************************************
  991. @@ -637,11 +675,31 @@
  992.  }
  993.  
  994.  /****************************************************************************
  995. +this is a safer strcpy(), meant to prevent core dumps when nasty things happen
  996. +****************************************************************************/
  997. +char *StrCpy(char *dest,char *src)
  998. +{
  999. +  char *d = dest;
  1000. +  if (!dest) return(NULL);
  1001. +  if (!src) {
  1002. +    *dest = 0;
  1003. +    return(dest);
  1004. +  }
  1005. +  while ((*d++ = *src++)) ;
  1006. +  return(dest);
  1007. +}
  1008. +
  1009. +/****************************************************************************
  1010.  line strncpy but always null terminates. Make sure there is room!
  1011.  ****************************************************************************/
  1012.  char *StrnCpy(char *dest,char *src,int n)
  1013.  {
  1014.    char *d = dest;
  1015. +  if (!dest) return(NULL);
  1016. +  if (!src) {
  1017. +    *dest = 0;
  1018. +    return(dest);
  1019. +  }
  1020.    while (n-- && (*d++ = *src++)) ;
  1021.    *d = 0;
  1022.    return(dest);
  1023. @@ -872,10 +930,11 @@
  1024.  /*******************************************************************
  1025.    create a unix date from a dos date
  1026.  ********************************************************************/
  1027. -time_t make_unix_date(void *date_ptr)
  1028. +time_t make_unix_date(void *date_ptr,BOOL add_dst)
  1029.  {
  1030.    uint32 dos_date=0;
  1031.    struct tm t;
  1032. +  time_t ret;
  1033.  
  1034.    dos_date = IVAL(date_ptr,0);
  1035.  
  1036. @@ -887,13 +946,16 @@
  1037.    t.tm_yday = 1;
  1038.    t.tm_isdst = -1;
  1039.  
  1040. -  return (TimeLocal(&t,GMT_TO_LOCAL));
  1041. +  ret = TimeLocal(&t,GMT_TO_LOCAL);
  1042. +
  1043. +  if (add_dst) ret += DSTDiff(ret);
  1044. +  return(ret);
  1045.  }
  1046.  
  1047.  /*******************************************************************
  1048.    create a unix date from a dos date
  1049.  ********************************************************************/
  1050. -time_t make_unix_date2(void *date_ptr)
  1051. +time_t make_unix_date2(void *date_ptr,BOOL add_dst)
  1052.  {
  1053.    uint32 x,x2;
  1054.  
  1055. @@ -901,7 +963,7 @@
  1056.    x2 = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16);
  1057.    SIVAL(&x,0,x2);
  1058.  
  1059. -  return(make_unix_date((void *)&x));
  1060. +  return(make_unix_date((void *)&x,add_dst));
  1061.  }
  1062.  
  1063.  
  1064. @@ -2566,7 +2628,7 @@
  1065.  }
  1066.  
  1067.  /* this is used to prevent lots of mallocs of size 1 */
  1068. -char *null_string = NULL;
  1069. +static char *null_string = NULL;
  1070.  
  1071.  /****************************************************************************
  1072.  set a string value, allocing the space for the string
  1073. @@ -2582,10 +2644,9 @@
  1074.    if (l == 0)
  1075.      {
  1076.        if (!null_string)
  1077. -    {
  1078. -      null_string = (char *)malloc(1);
  1079. -      *null_string = 0;
  1080. -    }
  1081. +    null_string = (char *)malloc(1);
  1082. +
  1083. +      *null_string = 0;
  1084.        *dest = null_string;
  1085.      }
  1086.    else
  1087. @@ -3603,116 +3664,6 @@
  1088.    SIVAL(p,0,tlow);
  1089.    SIVAL(p,4,thigh);
  1090.  }
  1091. -
  1092. -
  1093. -/****************************************************************************
  1094. -interpret a short filename structure
  1095. -The length of the structure is returned
  1096. -****************************************************************************/
  1097. -int interpret_short_filename(char *p,file_info *finfo)
  1098. -{
  1099. -  finfo->mode = CVAL(p,21);
  1100. -
  1101. -  finfo->mtime = finfo->atime = finfo->ctime = make_unix_date(p+22);
  1102. -  finfo->size = IVAL(p,26);
  1103. -  strcpy(finfo->name,p+30);
  1104. -  
  1105. -  return(DIR_STRUCT_SIZE);
  1106. -}
  1107. -
  1108. -/****************************************************************************
  1109. -interpret a long filename structure - this is mostly guesses at the moment
  1110. -The length of the structure is returned
  1111. -The structure of a long filename depends on the info level. 260 is used
  1112. -by NT and 2 is used by OS/2
  1113. -****************************************************************************/
  1114. -int interpret_long_filename(int level,char *p,file_info *finfo)
  1115. -{
  1116. -  if (finfo)
  1117. -    memcpy(finfo,&def_finfo,sizeof(*finfo));
  1118. -
  1119. -  switch (level)
  1120. -    {
  1121. -    case 1: /* OS/2 understands this */
  1122. -      if (finfo)
  1123. -    {
  1124. -      finfo->ctime = make_unix_date2(p+4);
  1125. -      finfo->atime = make_unix_date2(p+8);
  1126. -      finfo->mtime = make_unix_date2(p+12);
  1127. -      finfo->size = IVAL(p,16);
  1128. -      finfo->mode = CVAL(p,24);
  1129. -      strcpy(finfo->name,p+27);
  1130. -    }
  1131. -      return(28 + CVAL(p,26));
  1132. -
  1133. -    case 2: /* this is what OS/2 uses mostly */
  1134. -      if (finfo)
  1135. -    {
  1136. -      finfo->ctime = make_unix_date2(p+4);
  1137. -      finfo->atime = make_unix_date2(p+8);
  1138. -      finfo->mtime = make_unix_date2(p+12);
  1139. -      finfo->size = IVAL(p,16);
  1140. -      finfo->mode = CVAL(p,24);
  1141. -      strcpy(finfo->name,p+31);
  1142. -    }
  1143. -      return(32 + CVAL(p,30));
  1144. -
  1145. -      /* levels 3 and 4 are untested */
  1146. -    case 3:
  1147. -      if (finfo)
  1148. -    {
  1149. -      finfo->ctime = make_unix_date2(p+8);
  1150. -      finfo->atime = make_unix_date2(p+12);
  1151. -      finfo->mtime = make_unix_date2(p+16);
  1152. -      finfo->size = IVAL(p,20);
  1153. -      finfo->mode = CVAL(p,28);
  1154. -      strcpy(finfo->name,p+33);
  1155. -    }
  1156. -      return(SVAL(p,4)+4);
  1157. -
  1158. -    case 4:
  1159. -      if (finfo)
  1160. -    {
  1161. -      finfo->ctime = make_unix_date2(p+8);
  1162. -      finfo->atime = make_unix_date2(p+12);
  1163. -      finfo->mtime = make_unix_date2(p+16);
  1164. -      finfo->size = IVAL(p,20);
  1165. -      finfo->mode = CVAL(p,28);
  1166. -      strcpy(finfo->name,p+37);
  1167. -    }
  1168. -      return(SVAL(p,4)+4);
  1169. -
  1170. -    case 260: /* NT uses this, but also accepts 2 */
  1171. -      if (finfo)
  1172. -    {
  1173. -      int ret = SVAL(p,0);
  1174. -      int namelen;
  1175. -      p += 4; /* next entry offset */
  1176. -      p += 4; /* fileindex */
  1177. -      finfo->ctime = interpret_long_date(p); p += 8;
  1178. -      finfo->atime = interpret_long_date(p); p += 8;
  1179. -      finfo->mtime = interpret_long_date(p); p += 8; p += 8;
  1180. -      finfo->mtime += DSTDiff(finfo->mtime) - serverzone;
  1181. -      finfo->ctime += DSTDiff(finfo->ctime) - serverzone;
  1182. -      finfo->atime += DSTDiff(finfo->atime) - serverzone;
  1183. -      finfo->size = IVAL(p,0); p += 8;
  1184. -      p += 8; /* alloc size */
  1185. -      finfo->mode = CVAL(p,0); p += 4;
  1186. -      namelen = IVAL(p,0); p += 4;
  1187. -      p += 4; /* EA size */
  1188. -      p += 2; /* short name len? */
  1189. -      p += 24; /* short name? */      
  1190. -      StrnCpy(finfo->name,p,namelen);
  1191. -      return(ret);
  1192. -    }
  1193. -      return(SVAL(p,0));
  1194. -    }
  1195. -
  1196. -  DEBUG(1,("Unknown long filename format %d\n",level));
  1197. -  return(SVAL(p,0));
  1198. -}
  1199. -
  1200. -
  1201.  
  1202.  /*******************************************************************
  1203.  sub strings with useful parameters
  1204. diff -u -r --new-file last-version/source/version.h samba-1.9.14p2/source/version.h
  1205. --- last-version/source/version.h    Mon Oct 30 17:32:32 1995
  1206. +++ samba-1.9.14p2/source/version.h    Sat Nov  4 23:21:27 1995
  1207. @@ -1 +1 @@
  1208. -#define VERSION "1.9.14p1"
  1209. +#define VERSION "1.9.14p2"
  1210.